package br.com.rotaestatistica.daos;

import java.sql.PreparedStatement;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.rotaestatistica.entities.UsuarioCadastradoEntity;
import br.com.rotaestatistica.utils.FabricaDeConexao;

public class UsuarioCadastradoDAO {

	public List<UsuarioCadastradoEntity> selectAllUsuarioCadastradosAsList() {
		List<UsuarioCadastradoEntity> list = new ArrayList<UsuarioCadastradoEntity>();
		PreparedStatement pstm = null;
		ResultSet rs = null;

		String SQL = "SELECT * FROM UsuarioCadastrado";

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);

			rs = pstm.executeQuery();
			while (rs.next()) {
				UsuarioCadastradoEntity usuario = new UsuarioCadastradoEntity();

				usuario.setId_UsuarioCadastrado(rs
						.getLong("idUsuarioCadastrado"));
				usuario.setNome(rs.getString("nome"));
				usuario.setDataDeNascimento(rs.getDate("dataDeNascimento"));
				usuario.setSexo(rs.getString("sexo"));
				usuario.setTelefone(rs.getLong("telefone"));
				usuario.setEmail(rs.getString("email"));
				usuario.setSenha(rs.getString("senha"));

				list.add(usuario);
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				rs.close();
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public UsuarioCadastradoEntity selectUsuarioCadastradoById(
			long idUsuarioCadastrado) {

		UsuarioCadastradoEntity usuario = new UsuarioCadastradoEntity();
		PreparedStatement pstm = null;
		ResultSet rs = null;

		String SQL = "SELECT * FROM UsuarioCadastrado WHERE idUsuarioCadastrado = ?";

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
			pstm.setLong(1, idUsuarioCadastrado);

			rs = pstm.executeQuery();
			usuario.setDataDeNascimento(rs.getDate("dataDeNascimento"));
			usuario.setEmail(rs.getString("email"));
			usuario.setId_UsuarioCadastrado(rs.getLong("idUsuarioCadastrado"));
			usuario.setNome(rs.getString("nome"));
			usuario.setSenha(rs.getString("senha"));
			usuario.setSexo(rs.getString("sexo"));
			usuario.setTelefone(rs.getLong("telefone"));

			return usuario;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				rs.close();
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public boolean insertUsuarioCadastrado(
			UsuarioCadastradoEntity usuarioCadastrado) {

		PreparedStatement pstm = null;

		String SQL = "INSERT INTO UsuarioCadastrado(nome,dataDeNascimento,sexo,telefone,email,senha) VALUES (?,?,?,?,?,?)";

		try {

			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
			pstm.setString(1, usuarioCadastrado.getNome());
			pstm.setDate(2, usuarioCadastrado.getSqlDataDeNascimento());
			pstm.setString(3, usuarioCadastrado.getSexo());
			pstm.setLong(4, usuarioCadastrado.getTelefone());
			pstm.setString(5, usuarioCadastrado.getEmail());
			pstm.setString(6, usuarioCadastrado.getSenha());

			pstm.executeUpdate();

			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public boolean deleteUsuarioCadastradoById(long idUsuarioCadastrado) {
		PreparedStatement pstm = null;

		String SQL = "DELETE FROM UsuarioCadastrado WHERE idUsuarioCadastrado = "
				+ idUsuarioCadastrado;

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);

			pstm.executeQuery();

			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public boolean updateUsuarioCadastrado(
			UsuarioCadastradoEntity usuarioCadastrado) {
		PreparedStatement pstm = null;

		String SQL = "UPDATE UsuarioCadastrado SET nome=?,dataDeNascimento=?,sexo=?,telefone=?,email=?,senha=?, login=? WHERE idUsuarioCadastrado="
				+ usuarioCadastrado.getId_UsuarioCadastrado();

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
			pstm.setString(1, usuarioCadastrado.getNome());
			pstm.setDate(2, usuarioCadastrado.getSqlDataDeNascimento());
			pstm.setString(3, usuarioCadastrado.getSexo());
			pstm.setLong(4, usuarioCadastrado.getTelefone());
			pstm.setString(5, usuarioCadastrado.getEmail());
			pstm.setString(6, usuarioCadastrado.getSenha());

			pstm.executeQuery();

			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public UsuarioCadastradoEntity selectUsuarioCadastradoByEmail(String email) {

		if(email == null || email.isEmpty()){
			return null;
		}
		
		UsuarioCadastradoEntity usuario = new UsuarioCadastradoEntity();
		PreparedStatement pstm = null;
		ResultSet rs = null;

		String SQL = "SELECT * FROM UsuarioCadastrado WHERE email=?";

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
			pstm.setString(1, email);

			rs = pstm.executeQuery();

			while (rs.next()) {
				usuario.setDataDeNascimento(rs.getDate("dataDeNascimento"));
				usuario.setEmail(rs.getString("email"));
				usuario.setId_UsuarioCadastrado(rs
						.getLong("idUsuarioCadastrado"));
				usuario.setNome(rs.getString("nome"));
				usuario.setSenha(rs.getString("senha"));
				usuario.setSexo(rs.getString("sexo"));
				usuario.setTelefone(rs.getLong("telefone"));
				return usuario;
			}
			return null;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				rs.close();
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public boolean updateLogin(long id_usuario, boolean login) {
		String sql = "Update UsuarioCadastrado SET login = ? WHERE idUsuarioCadastrado = ?";
		PreparedStatement pstm = null;

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(sql);
			pstm.setBoolean(1, login);
			pstm.setLong(2, id_usuario);
			pstm.executeUpdate();
			return true;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}
}